---
slug: 2024-03-26-move
title: Конструктор перемещения и оператор присваивания с перемещением
authors: [aladin]
tags: [разработка]
---

В данной статье представлен пример использования конструктора перемещения и оператора присваивания с перемещением.

<!--truncate-->

Статьи, объясняющие теорию:

1. [Конструктор перемещения | METANIT.COM](https://metanit.com/cpp/tutorial/14.2.php)
2. [Оператор присваивания с перемещением | METANIT.COM](https://metanit.com/cpp/tutorial/14.3.php)
3. [std::move | cppreference.com](https://en.cppreference.com/w/cpp/utility/move)

Пример:

```cpp
#include <iostream>
#include <utility>
using namespace std;

class A {
  int value;

 public:
  A(int v = 0) : value{v} { cout << "A(" << value << ")" << endl; }
  ~A() { cout << "~A(" << value << ")" << endl; }
  // Simple move constructor
  A(A&& right) {
    this->value = right.value;
    right.value = 0;
    cout << "A&&(" << value << ")" << endl;
  }
  // Simple move assignment operator
  A& operator=(A&& right) {
    this->value = right.value;
    right.value = 0;
    cout << "operator=(&&" << value << ")" << endl;
    return *this;
  }
  A& operator=(A& right) {
    this->value = right.value;
    cout << "operator=(&" << value << ")" << endl;
    return *this;
  }
};

int main(int, char**) {
  A a1(1);               // A(1)
  A temp(-1);            // A(-1)
  temp = std::move(a1);  // operator=(&&1)
  A a2(2);               // A(2)
  A a3(std::move(a2));   // A&&(2)
  temp = a3;             // operator=(&2)
  // ~A(2)
  // ~A(0)
  // ~A(2)
  // ~A(0)
}
```
